// 模拟DeepSeek大模型的前端实现

// 使用OpenAI API调用DeepSeek-R1-0528-Qwen3-8B模型
import axios from 'axios';

// 定义响应类型
interface ChatResponse {
  sessionId: string;
  reply: string;
  thinking?: string[];
}

// 健身领域知识库 - 用于增强回复的专业性
const fitnessKnowledgeBase = {
  // 基础健身概念
  basics: [
    "肌肉生长需要适当的刺激、营养和休息",
    "复合动作比孤立动作更有效率",
    "进阶训练应遵循渐进超负荷原则",
    "有氧运动和力量训练结合更有利于全面健康",
    "训练计划应包括热身和拉伸环节"
  ],
  
  // 常见训练方法
  trainingMethods: [
    "HIIT训练：高强度间歇训练，能在短时间内获得显著效果",
    "分化训练：每天训练不同肌群，给肌肉充分恢复时间",
    "全身训练：每次训练涵盖全身主要肌群",
    "超级组训练：两个动作之间不休息，提高训练效率",
    "金字塔训练：逐渐增加或减少重量和次数"
  ],
  
  // 营养建议
  nutrition: [
    "蛋白质摄入：每公斤体重1.6-2.2克蛋白质",
    "碳水化合物：提供训练能量，应占总热量的40-60%",
    "健康脂肪：有助于激素平衡，应占总热量的20-35%",
    "训练前后营养：训练前碳水为主，训练后蛋白质和碳水结合",
    "水分摄入：每天至少2升水，训练时每15-20分钟补充200-300ml"
  ],
  
  // 常见问题解答
  faq: {
    "肌肉酸痛": "延迟性肌肉酸痛(DOMS)是微小肌纤维损伤和炎症反应导致的，通常在运动后24-72小时达到峰值。缓解方法包括轻度活动、适当拉伸、冷热敷、按摩和充分休息。",
    "增肌": "增肌需要热量盈余(每天多摄入300-500卡路里)、足够蛋白质、渐进式力量训练和充分休息。主要训练复合动作，如深蹲、硬拉、卧推等。",
    "减脂": "减脂需要热量赤字(每天少摄入300-500卡路里)、高蛋白饮食、结合力量训练和有氧运动，以及控制碳水摄入时机。",
    "初学者": "初学者应从基础复合动作开始，注重正确姿势，循序渐进增加强度，每周训练3-4次，每次不超过1小时。",
    "运动频率": "一般建议每周进行150-300分钟中等强度有氧活动，或75-150分钟高强度有氧活动，以及每周2-3次全身力量训练。"
  }
};

// 思考过程模拟 - 更加专业化
const simulateThinking = (question: string): string[] => {
  // 基础思考步骤
  const thoughts = [
    "分析用户问题的核心意图和关键词...",
    "检索健身领域的专业知识库...",
    "评估多种可能的回答方向...",
    "组织语言，确保回答专业且易于理解..."
  ];
  
  // 根据问题类型添加特定的思考过程
  if (question.includes('运动计划') || question.includes('健身计划')) {
    thoughts.push("分析用户可能的健身水平和目标...");
    thoughts.push("参考运动科学研究，设计符合渐进超负荷原则的计划...");
    thoughts.push("考虑训练频率、强度、时间和类型的平衡...");
  } else if (question.includes('肌肉酸痛') || question.includes('酸痛') || question.includes('疼痛')) {
    thoughts.push("分析延迟性肌肉酸痛(DOMS)的生理机制...");
    thoughts.push("区分正常训练后酸痛与潜在伤害的区别...");
    thoughts.push("评估不同恢复方法的科学依据和有效性...");
  } else if (question.includes('初学者') || question.includes('健身动作') || question.includes('动作')) {
    thoughts.push("筛选适合初学者的基础复合动作...");
    thoughts.push("分析动作的肌肉激活模式和生物力学原理...");
    thoughts.push("整理动作要领和常见错误的纠正方法...");
  } else if (question.includes('多长时间') || question.includes('频率') || question.includes('多久')) {
    thoughts.push("参考ACSM和WHO的运动指南建议...");
    thoughts.push("分析不同训练频率对不同健身目标的影响...");
    thoughts.push("考虑个体差异因素，如恢复能力、年龄和训练经验...");
  } else if (question.includes('饮食') || question.includes('营养') || question.includes('蛋白质')) {
    thoughts.push("分析不同健身目标的营养需求差异...");
    thoughts.push("评估宏量营养素比例和微量营养素的重要性...");
    thoughts.push("考虑训练前后的营养时间窗口优化...");
  }
  
  return thoughts;
};

// AI模型配置 - 更新为硅基流动API
const AI_API_KEY = 'sk-dcjkzeqakvgowmyxxmuozahyaxdzbxziopgndjrlblqrwote'; // 替换为您的实际硅基流动API密钥
const AI_API_ENDPOINT = 'https://api.guiji.ai/v1/chat/completions'; // 修正的API端点

// 生成真实AI回复
const generateAIResponse = async (question: string): Promise<string> => {
  try {
    // 构建提示词，引导AI生成健身相关的专业回答
    const prompt = `作为一名专业的健身教练和营养师，请回答以下健身相关问题，提供科学、专业、详细的建议：\n\n${question}`;
    
    // 调用硅基流动AI API
    const response = await axios.post(AI_API_ENDPOINT, {
      model: 'guiji-llama3-8b-32k', // 使用硅基流动的最新模型
      messages: [
        { role: 'system', content: '你是一个专注于健身、营养和健康领域的AI助手，拥有丰富的专业知识。你的回答应该基于科学研究，并且易于理解。' },
        { role: 'user', content: prompt }
      ],
      temperature: 0.7,
      max_tokens: 800
    }, {
      headers: {
        'Authorization': `Bearer ${AI_API_KEY}`,
        'Content-Type': 'application/json'
      }
    });
    
    // 返回AI生成的回复
    return response.data.choices[0].message.content;
  } catch (error) {
    console.error('调用AI API失败:', error);
    // 如果API调用失败，回退到本地生成的回复
    return generateLocalResponse(question);
  }
};

// 本地回复生成函数 (作为备份)
export const generateLocalResponse = (question: string): string => {
  // 提取问题中的关键词
  const keywords = question.toLowerCase();
  
  // 根据关键词匹配最佳回答
  if (keywords.includes('运动计划') || keywords.includes('健身计划')) {
    return '根据运动科学的最新研究，制定个人运动计划需要综合考虑多个因素：\n\n1. **个人健康状况**：包括基础体能、既往伤病和潜在健康风险\n2. **具体目标**：减脂、增肌、提高耐力或灵活性等\n3. **时间安排**：可投入的时间和最佳运动时段\n4. **个人偏好**：喜欢的运动类型和环境\n\n建议先进行专业的体能评估，然后遵循渐进原则：从每周3次、每次30分钟的中等强度有氧运动开始，逐步增加到每周4-5次，同时加入2-3次力量训练。记得每次运动前后都要进行5-10分钟的热身和放松。\n\n对于力量训练，初学者可采用全身训练模式，每周3次，中间间隔休息日；进阶者可考虑分化训练，如上下肢分开或推拉腿分开训练。';
  } else if (keywords.includes('肌肉酸痛') || keywords.includes('酸痛') || keywords.includes('疼痛')) {
    return '运动后的肌肉酸痛（DOMS，延迟性肌肉酸痛）是肌纤维微损伤和随后的炎症反应导致的，通常在运动后24-72小时达到峰值。这是肌肉适应训练刺激的正常现象，但过度的酸痛可能表明训练强度提升过快。\n\n缓解方法基于最新运动医学研究：\n\n1. **主动恢复**：进行低强度活动，如轻度步行或骑自行车，促进血液循环，加速代谢废物清除\n2. **适当拉伸**：进行静态拉伸，但避免过度拉伸已经酸痛的肌肉\n3. **冷热交替疗法**：先冷敷（减轻炎症）后热敷（促进血液循环），各15-20分钟\n4. **营养补充**：摄入足够蛋白质（修复肌纤维）和氧化反应物质（如维生素C和E）\n5. **充分水分**：加速代谢废物排出\n6. **充足睡眠**：提供肌肉恢复所需的条件，促进生长激素释放\n7. **泡沫轴按摩**：可帮助缓解肌筋膜紧张和促进血液循环\n\n如果疼痛剧烈、持续时间异常长（超过5天）或伴随其他症状如肿胀、发热，及时咨询专业医生，可能是运动损伤而非普通的肌肉酸痛。';
  } else if (keywords.includes('初学者') || keywords.includes('健身动作') || keywords.includes('动作')) {
    return '基于运动生理学原理，初学者应从以下基础复合动作开始，这些动作能有效锻炼多个肌群，建立良好的肌肉协调性：\n\n1. **深蹲**：锻炼下肢和核心，注意保持脊柱中立，膝盖方向与脚尖一致，下蹲时大腿至少与地面平行\n\n2. **俯卧撑**：强化上肢和核心，初学者可从膝盖俯卧撑开始，保持身体成一直线，肘部靠近身体\n\n3. **平板支撑**：增强核心稳定性，保持身体成一直线，肩胛骨下沉，腹部收紧\n\n4. **弓步蹲**：改善下肢力量和平衡能力，前腿膝盖不超过脚尖，后腿膝盖轻触地面\n\n5. **桥式**：激活臀部肌群，改善姿势，肩膀和脚保持稳定，臀部向上抬起\n\n6. **哑铃划船**：强化背部和手臂肌群，保持backs平直，肘部向后拉，肩胛骨收紧\n\n7. **硬拉**：全身性复合动作，初学者可从臀桥硬拉开始学习髋铰链动作模式\n\n每个动作从8-12次，2-3组开始，确保动作质量优先于数量。随着适应性提高，逐渐增加难度和重量。建议在专业指导下学习正确姿势，避免受伤。\n\n初学者的训练频率建议为每周3-4次，每次训练45-60分钟，确保主要肌群每周至少训练1-2次。';
  } else if (keywords.includes('多长时间') || keywords.includes('频率') || keywords.includes('多久')) {
    return '根据美国运动医学会(ACSM)和世界卫生组织(WHO)的最新指南，健康成年人的运动时间建议如下：\n\n**有氧运动**：\n- 每周150-300分钟中等强度有氧活动（如快走、慢跑、骑自行车）\n- 或75-150分钟高强度有氧活动（如跑步、HIIT训练）\n- 或两者的等效组合\n- 理想的频率是每周分散进行，如每周5天，每天30分钟\n\n**力量训练**：\n- 每周至少2次，最好是2-3次，锻炼所有主要肌群\n- 每组8-12次重复（增肌目标）或15-20次（耐力目标）\n- 每个肌群2-4组\n- 主要肌群间隔48小时再次训练\n\n**灵活性训练**：\n- 每周至少2-3次，最好每天进行\n- 每次拉伸至轻微不适，保持15-30秒\n- 每个主要肌群或关节2-4次重复\n\n**休息与恢复**：\n- 每周至少安排1-2天完全休息或进行轻度活动\n- 高强度训练后应有足够恢复时间\n\n研究表明，即使是短时间的运动也有健康益处，关键是保持规律性和适当强度。对于久坐人群，建议每小时起身活动几分钟，打破久坐行为。\n\n记住，最佳的运动计划是你能长期坚持的计划。根据个人目标、健康状况和时间安排调整运动频率和时长。';
  } else if (keywords.includes('饮食') || keywords.includes('营养') || keywords.includes('蛋白质')) {
    return '健身营养是训练效果的关键组成部分，科学的饮食策略可以显著提升训练效果：\n\n**宏量营养素需求**：\n- **蛋白质**：对于经常训练的人，每公斤体重1.6-2.2克蛋白质最为理想，分散在一天多餐中摄入，每餐20-40克\n- **碳水化合物**：根据训练强度和目标调整，一般占总热量的40-60%，训练日可适当增加\n- **健康脂肪**：占总热量的20-35%，优先选择不饱和脂肪酸来源\n\n**训练前后营养策略**：\n- **训练前1-2小时**：摄入含碳水和少量蛋白质的餐点，如香蕉+希腊酸奶\n- **训练后30分钟内**：补充蛋白质和碳水化合物，比例约1:3，促进肌糖原恢复和蛋白质合成\n\n**水分摄入**：\n- 日常保持每天2-3升水分摄入\n- 训练前2小时饮用500ml水\n- 训练中每15-20分钟补充200-300ml水\n- 训练后根据体重减少情况补充1.5倍的失水量\n\n**微量营养素考虑**：\n- 确保摄入足够的维生素D、钙、镁和锌等矿物质\n- 多样化的水果蔬菜摄入可提供必要的氧化反应物质\n\n**根据训练目标调整**：\n- **增肌期**：保持300-500卡路里的热量盈余，增加碳水和蛋白质摄入\n- **减脂期**：创造300-500卡路里的热量赤字，保持高蛋白摄入，适当减少碳水\n\n记住，营养计划应个性化调整，考虑个人代谢率、训练强度和特定健康需求。循序渐进饮食调整比极端饮食更可持续。';
  } else {
    // 通用回复 - 修改为更灵活的回复生成方式
    // 分析问题中的关键词，尝试提供相关回复
    let response = '';
    
    // 检查是否包含健身相关词汇
    if (keywords.includes('健身') || keywords.includes('运动') || keywords.includes('锻炼') || 
        keywords.includes('肌肉') || keywords.includes('力量') || keywords.includes('有氧')) {
      response = `关于"${question}"，从健身科学来看，这涉及到运动生理学的几个关键原则。根据最新研究，合理的训练方案应结合个人体质特点、训练目标和时间安排。建议您在专业指导下，从基础动作开始，逐步提高训练强度和复杂性，同时注意营养补充和充分休息，以获得最佳效果。`;
    } 
    // 检查是否包含饮食相关词汇
    else if (keywords.includes('吃') || keywords.includes('食物') || keywords.includes('饮食') || 
             keywords.includes('营养') || keywords.includes('热量') || keywords.includes('减肥')) {
      response = `关于"${question}"，从营养学角度分析，均衡的饮食对健康和运动表现至关重要。建议摄入充足的蛋白质、复杂碳水化合物和健康脂肪，同时注意微量元素和维生素的补充。根据您的具体目标（增肌、减脂或维持），可以调整各类营养素的比例和总热量摄入。`;
    }
    // 检查是否包含健康相关词汇
    else if (keywords.includes('健康') || keywords.includes('恢复') || keywords.includes('伤病') || 
             keywords.includes('疼痛') || keywords.includes('睡眠') || keywords.includes('压力')) {
      response = `关于"${question}"，健康管理是运动生活的基础。良好的睡眠、压力管理和伤病预防对维持长期健康至关重要。建议您关注身体信号，合理安排训练与恢复的节奏，必要时咨询专业医疗人员的建议。`;
    }
    // 其他未识别的问题
    else {
      response = `您问的是关于"${question}"。作为运动健身AI助手，我专注于提供健身训练、营养饮食和健康管理方面的专业建议。如果您有这些领域的具体问题，我很乐意为您解答。您可以询问关于训练计划、运动技巧、饮食策略或健康管理的问题。`;
    }
    
    return response;
  }
};

// 高级回复生成函数
const generateAdvancedResponse = async (question: string): Promise<string> => {
  try {
    // 尝试使用AI API生成回复
    return await generateAIResponse(question);
  } catch (error) {
    console.error('高级回复生成失败，回退到本地回复:', error);
    // 如果AI API调用失败，回退到本地生成的回复
    return generateLocalResponse(question);
  }
};

// 聊天API
export const chatApi = {
  // 纯前端模拟发送消息到AI模型
  async sendMessage(userId: string, message: string, sessionId?: string): Promise<ChatResponse> {
    // 生成思考过程
    const thinking = simulateThinking(message);
    
    // 模拟网络延迟和AI思考过程
    return new Promise((resolve) => {
      // 模拟网络延迟 - 随机1-3秒
      const delay = Math.floor(Math.random() * 2000) + 1000;
      
      setTimeout(async () => {
        try {
          // 生成更高质量的回复 - 使用await处理Promise
          const reply = await generateAIResponse(message);
          
          // 返回结果
          resolve({
            sessionId: sessionId || `session_${Date.now()}`,
            reply,
            thinking
          });
        } catch (error) {
          console.error('发送消息失败:', error);
          // 使用本地回复作为备份
          const fallbackReply = generateLocalResponse(message);
          resolve({
            sessionId: sessionId || `session_${Date.now()}`,
            reply: fallbackReply,
            thinking
          });
        }
      }, delay);
    });
  },
  
  // 使用SSE流式输出回复
  streamResponse(userId: string, message: string, sessionId?: string, onThinking?: (step: string) => void, onToken?: (token: string) => void): Promise<ChatResponse> {
    return new Promise((resolve) => {
      // 生成思考过程
      const thinking = simulateThinking(message);
      
      // 模拟思考过程的流式输出
      let currentStep = 0;
      const thinkInterval = setInterval(() => {
        if (currentStep < thinking.length) {
          if (onThinking) {
            onThinking(thinking[currentStep]);
          }
          currentStep++;
        } else {
          clearInterval(thinkInterval);
          
          // 生成回复 - 处理异步
          generateAdvancedResponse(message).then(fullReply => {
            // 将回复拆分成单词进行流式输出
            const tokens = fullReply.split(/(?<=\s|\.|,|:|;|\?|!|\n)/g);
            let currentToken = 0;
            let accumulatedReply = '';
            
            // 模拟流式输出
            const streamInterval = setInterval(() => {
              if (currentToken < tokens.length) {
                const token = tokens[currentToken];
                accumulatedReply += token;
                
                if (onToken) {
                  onToken(token);
                }
                
                currentToken++;
              } else {
                clearInterval(streamInterval);
                
                // 完成流式输出后返回完整结果
                resolve({
                  sessionId: sessionId || `session_${Date.now()}`,
                  reply: accumulatedReply,
                  thinking
                });
              }
            }, 50); // 每50ms输出一个token
          }).catch(error => {
            console.error('流式回复生成失败:', error);
            // 如果生成回复失败，使用本地回复
            const fallbackReply = generateLocalResponse(message);
            resolve({
              sessionId: sessionId || `session_${Date.now()}`,
              reply: fallbackReply,
              thinking
            });
          });
        }
      }, 800); // 每个思考步骤显示800ms
    });
  }
};